/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package PanelDeProductos;

import PanelesDePlatos.Plato;
import com.google.gson.Gson;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import net.miginfocom.swing.MigLayout;

/**
 *
 * @author Pato
 */
public class VerProducto extends JPanel implements ActionListener, MouseListener
{
    
    private JPanel panel;
    private JTable tabla;
    private JScrollPane scroll;
    private DefaultTableModel modelo;
    private JLabel labelNombre, labelCodigo, labelPrecio,labelpromedioGeneral,labelvaloracion;
    private JComboBox comboBoxNombre;
    private JButton ver;
    private JTextField textoPrecio,textoCodigo,textoPromedio,textoValoracion;
    private ArrayList<Producto> productos;
    private List<String> productosOrdenados = new ArrayList<String>();
    private Gson gson = new Gson();
    
    public VerProducto(ArrayList<Producto> productos)
    {
        this.setLayout(new BorderLayout());
        this.productos = productos;
        
        this.panel = new JPanel();
        this.panel.setLayout(new MigLayout());
        this.labelNombre = new JLabel("Nombre");
        this.labelCodigo = new JLabel("Codigo");
        this.labelPrecio = new JLabel("Precio $");
        
        this.comboBoxNombre = new JComboBox();
        
        this.textoPrecio = new JTextField(20);
        this.textoCodigo = new JTextField(20);
        
        this.textoPrecio.setEditable(false);
        this.textoCodigo.setEditable(false);
        
        this.ver = new JButton("Ver");
        
        this.panel.add(labelNombre);
        this.panel.add(comboBoxNombre);
        this.panel.add(labelPrecio);
        this.panel.add(textoPrecio,"wrap");
        this.panel.add(labelCodigo);
        this.panel.add(textoCodigo);
        
        this.modelo = new DefaultTableModel()
        {
            public boolean isCellEditable(int row, int column) //Las celdas no son editables
            {
                if (row<tabla.getRowCount())
                {
                    return false;
                }
                return true;
            }
        };
        this.tabla = new JTable(modelo);
        this.tabla.getTableHeader().setReorderingAllowed(false);
        this.modelo.addColumn("Nombre");
        this.modelo.addColumn("Precio");
        this.modelo.addColumn("Código");
        this.modelo.addColumn("Valoración");
        this.modelo.addColumn("Promedio Valoración");
        this.scroll = new JScrollPane(tabla);
        this.scroll.setViewportView(tabla);
        
        this.add(scroll);

        leerProductosTxt();
        productosOrdenados();
        llenarTabla();
        
        //this.panel.add(ver);
        
        //this.add(panel, BorderLayout.CENTER);
        
        comboBoxNombre.addActionListener(this);
    }
    

    @Override
    public void actionPerformed(ActionEvent e) 
    {
        Object click = e.getSource();
        
        if (click == comboBoxNombre)
        {
            if (comboBoxNombre.getItemCount() > 0)
            {
                String nombre = comboBoxNombre.getSelectedItem().toString();
                llenarCamposVisibles(nombre);
            }
        }
    }

    @Override
    public void mouseClicked(MouseEvent e) 
    {
        
    }

    @Override
    public void mousePressed(MouseEvent e) 
    {
        
    }

    @Override
    public void mouseReleased(MouseEvent e) 
    {
        
    }

    @Override
    public void mouseEntered(MouseEvent e) 
    {
        
    }

    @Override
    public void mouseExited(MouseEvent e) 
    {
        
    }
    
    public void llenarTabla()
    {
        while (modelo.getRowCount() > 0)
        {
            modelo.removeRow(0);
        }
        for (int i=0; i<productosOrdenados.size(); i++)
        {
            String nombre = productosOrdenados.get(i);
            int indice = posicionProductoOrdenado(nombre);
            String precio = productos.get(indice).getPrecio()+"";
            String codigo = productos.get(indice).getCodigo();
            Object[] filaProducto = {nombre, precio, codigo};
            modelo.addRow(filaProducto);
        }
    }
    
    public void productosOrdenados()
    {
        productosOrdenados.clear();
        
        for (int i=0; i<productos.size(); i++)
        {
            String nombreProducto = productos.get(i).getNombre().toLowerCase();
            
            if (!existeNombreProducto(nombreProducto))
            {
                productosOrdenados.add(productos.get(i).getNombre().toLowerCase());
            }
        }
        Collections.sort(productosOrdenados);
    }
    
    public boolean existeNombreProducto(String nombreProductoActual) //Recorremos y preguntamos si el nombre existe, para no repetir
    {
        for (int i=0; i<productosOrdenados.size(); i++)
        {
            if (productosOrdenados.get(i).equals(nombreProductoActual))
            {
                return true; //Existe
            }
        }
        return false; //No existe
    }
    
    public int posicionProductoOrdenado(String nombre) //Dado el nombre de plato (array ordenado) buscamos sus atributos en platos desordenados
    {
        for (int i=0; i<productos.size(); i++)
        {
            if (nombre.equals(productos.get(i).getNombre()))
            {
                return i;
            }
        }
        return 0;
    }
    
    public void llenarCamposVisibles(String nombre)
    {
        for (int i=0; i<productos.size(); i++)
        {
            if (productos.get(i).getNombre().equals(nombre))
            {
                textoPrecio.setText(productos.get(i).getPrecio()+"");
                textoCodigo.setText(productos.get(i).getCodigo());
                textoValoracion.setText(productos.get(i).getValoracion()+"");
                updateUI();
           }
        }
    }
    
    public void llenarComboBox()
    {
        comboBoxNombre.removeAllItems();
        
        for (int i=0; i<productos.size(); i++)
        {
            String nombre = productos.get(i).getNombre(); 
            
            if (!existeNombre(nombre)) //si no está el nombre...
            {
                comboBoxNombre.addItem(nombre);
            }
        }
    }
    
    public boolean existeNombre(String nombre)
    {
        for (int i=0; i<comboBoxNombre.getItemCount(); i++)
        {
            if (nombre.equals(comboBoxNombre.getItemAt(i).toString())) //Existe ya el nombre de plano en el comboBox?
            {
                return true;
            }
        }
        return false;
    }
    
    public void leerProductosTxt()
    {
        File archivo = null;
        FileReader fr = null;
        BufferedReader br = null;
        productos.clear();
        
        try
        {
            archivo = new File("C:\\BaseDeDatos\\productos.txt");
            fr = new FileReader (archivo);
            br = new BufferedReader(fr);
            
            String linea;
            
            while((linea=br.readLine())!=null)
            {
                Producto producto = (Producto)gson.fromJson(linea, Producto.class);
                productos.add(producto);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if( null != fr )
                {   
                    fr.close();     
                }                  
            }
            catch (Exception e2)
            {
                e2.printStackTrace();
            }
        }
    }
    
}
